home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
GraphicViewers
/
TIFFframes
/
Source
/
ToTIFF.m
< prev
next >
Wrap
Text File
|
1992-05-10
|
8KB
|
300 lines
/* Generated by Interface Builder */
#import "ToTIFF.h"
#import <appkit/Form.h>
#import <streams/streams.h>
#import <appkit/Application.h>
#import <appkit/OpenPanel.h>
#import <appkit/NXImage.h>
#import <appkit/NXBitmapImageRep.h>
#import <appkit/Button.h>
#import <appkit/Control.h>
#import <appkit/SavePanel.h>
#import <appkit/tiff.h>
#import <dpsclient/psops.h>
#import <dpsclient/wraps.h>
#import <sys/param.h>
#import <stdio.h>
#import <stdlib.h>
#import <strings.h>
@implementation ToTIFF
#define WIDTH 256
#define HEIGHT 256
#define BITMAPDIRECTORY "Library/Images/bitmaps"
#define REDFILE "b7"
#define GREENFILE "b4"
#define BLUEFILE "b2"
#define STARTFRAME 1
#define ENDFRAME 40
#define LZW 0
#define PACKBITS 1
#define JPEG 2
#define NONE 3
#define FALSE 0
#define TRUE !FALSE
void prefixdirectory(char *dirname, char *filename)
{
char *tmp;
tmp = (char *)malloc(200);
strcpy(tmp, dirname);
if(strcmp(&tmp[strlen(tmp)-1],"/")) strcat(tmp,"/");
strcat(tmp, filename);
strcpy(filename, tmp);
free(tmp);
}
void postfixframe(char *filename, int frameInt)
{
char *frameString;
frameString = (char *)malloc(6);
if(strcmp(&filename[strlen(filename)-1],".")) strcat(filename,".");
sprintf(frameString, "%d", frameInt);
strcat(filename, frameString);
free(frameString);
}
unsigned char *loadbyteimage(char *imagename, int *bytecount)
{
NXStream *stream;
char *streambuffer=NULL;
int length, maxlength;
if ((stream = NXMapFile(imagename, NX_READONLY)) != NULL) {
NXGetMemoryBuffer(stream, &streambuffer, &length, &maxlength);
*bytecount = length;
NXClose(stream);
return((unsigned char *)streambuffer);
} else {
NXRunAlertPanel("Error Opening File",
"Filename: %s","OK",NULL,NULL,imagename);
return(NULL);
}
}
unsigned char *equalizebyteimage(unsigned char *buffer, int bytecount)
{
long int histogram[256], fill;
int i=0;
unsigned char *cursor;
/* point to the start of the image data */
cursor=buffer;
/* zero the histogram array */
for(i=0;i<256;i++) histogram[i]=0L;
/* count up each byte value and store it in the histogram array */
i=0;
while(i++<bytecount) histogram[(unsigned int)*(cursor++)]++;
/* compute the cumulative histogram */
for(i=1;i<256;i++) histogram[i]=histogram[i]+histogram[i-1];
/* Check that the total counts are correct!!! */
/* If so, then normalize the cumulative histogram and */
/* compute and return the equalized buffer; */
/* if not, then alert the user. */
if(histogram[255]==bytecount) {
fill=histogram[0];
for(i=0;i<256;i++)histogram[i]=
255*(histogram[i]-fill)
/(histogram[255]-fill);
cursor=buffer;
i=0;
while(i++<bytecount){
*cursor=(unsigned char)histogram[(unsigned int)*cursor];
cursor++;
}
return(buffer);
} else {
NXRunAlertPanel("Error in Cumulative Histogram count",
"bytecount=%d != histogram[255]= %d",
"OK",NULL,NULL,bytecount, histogram[255]);
return(NULL);
}
}
- setDefaults:sender
{
char *home, *bitmapdirectory;
home = (char *)malloc(100);
bitmapdirectory = (char *)malloc(200);
strcpy(home,getenv("HOME"));
strcpy(bitmapdirectory, BITMAPDIRECTORY);
prefixdirectory(home, bitmapdirectory);
/* initialize bitmapinfo table with default values */
[bitmapinfo setIntValue:WIDTH at:0];
[bitmapinfo setIntValue:HEIGHT at:1];
[bitmapinfo setStringValue:bitmapdirectory at:2];
[bitmapinfo setStringValue:REDFILE at:3];
[bitmapinfo setStringValue:GREENFILE at:4];
[bitmapinfo setStringValue:BLUEFILE at:5];
[bitmapinfo setIntValue:STARTFRAME at:6];
[bitmapinfo setIntValue:ENDFRAME at:7];
/* initialize compression type with default value */
compression = NX_TIFF_COMPRESSION_JPEG;
[compressiontype selectCellAt:JPEG:0];
/* initialize equalize switch with default value */
equalize = FALSE;
[equalizeswitch setState:equalize];
return self;
}
- doLZW:sender
{
compression = NX_TIFF_COMPRESSION_LZW;
[compressiontype selectCellAt:LZW:0];
return self;
}
- doPACKBITS:sender
{
compression = NX_TIFF_COMPRESSION_PACKBITS;
[compressiontype selectCellAt:PACKBITS:0];
return self;
}
- doJPEG:sender
{
compression = NX_TIFF_COMPRESSION_JPEG;
[compressiontype selectCellAt:JPEG:0];
return self;
}
- doNONE:sender
{
compression = NX_TIFF_COMPRESSION_NONE;
[compressiontype selectCellAt:NONE:0];
return self;
}
- doEQUALIZE:sender
{
equalize = ![equalizeswitch state];
[equalizeswitch setState:equalize];
return self;
}
- toTIFFMethod:sender
{
char filename[MAXPATHLEN+1], tempfilename[MAXPATHLEN+1];
id myImage;
unsigned char *myImagePlanes[3];
int width, height, startframe, endframe, currentframe;
int bytecount, redbytes=0, greenbytes=0, bluebytes=0;
char *bitmapsdirectory, *redfile, *greenfile, *bluefile;
char *tempredfile, *tempgreenfile, *tempbluefile;
unsigned char *redbuffer=NULL, *greenbuffer=NULL, *bluebuffer=NULL;
/* allocate space for strings */
bitmapsdirectory = (char *)malloc(100);
redfile = (char *)malloc(200);
greenfile = (char *)malloc(200);
bluefile = (char *)malloc(200);
tempredfile = (char *)malloc(200);
tempgreenfile = (char *)malloc(200);
tempbluefile = (char *)malloc(200);
/* store user's table entries into variables */
width = [bitmapinfo intValueAt:0];
height = [bitmapinfo intValueAt:1];
strcpy(bitmapsdirectory, [bitmapinfo stringValueAt:2]);
strcpy(redfile, [bitmapinfo stringValueAt:3]);
strcpy(greenfile,[bitmapinfo stringValueAt:4]);
strcpy(bluefile, [bitmapinfo stringValueAt:5]);
startframe = [bitmapinfo intValueAt:6];
endframe = [bitmapinfo intValueAt:7];
/* prefix redfile, greenfile and bluefile with bitmapsdirectory */
prefixdirectory(bitmapsdirectory, redfile);
prefixdirectory(bitmapsdirectory, greenfile);
prefixdirectory(bitmapsdirectory, bluefile);
bytecount = width*height;
/* read in the frames, beginning with startframe, ending with endframe */
currentframe = startframe;
while(currentframe <= endframe) {
/* tack the current frame number onto the end of each filename */
strcpy(tempredfile, redfile);
strcpy(tempgreenfile, greenfile);
strcpy(tempbluefile, bluefile);
postfixframe(tempredfile, currentframe);
postfixframe(tempgreenfile, currentframe);
postfixframe(tempbluefile, currentframe);
/* read in the bitmap files for this particular frame */
/* and put bytes into 3 buffers */
if((redbuffer = loadbyteimage(tempredfile, &redbytes))==NULL)
return self;
if((greenbuffer = loadbyteimage(tempgreenfile, &greenbytes))==NULL)
return self;
if((bluebuffer = loadbyteimage(tempbluefile, &bluebytes))==NULL)
return self;
if ((redbytes==bytecount)&&(greenbytes==bytecount)&&(bluebytes==bytecount))
{
/* apply appropriate stretch, if requested */
if(equalize) {
if(equalizebyteimage(redbuffer, redbytes)==NULL) return self;
if(equalizebyteimage(greenbuffer,greenbytes)==NULL)return self;
if(equalizebyteimage(bluebuffer, bluebytes)==NULL)return self;
}
/* assign them to myImagePlanes */
myImagePlanes[0] = (unsigned char *)redbuffer;
myImagePlanes[1] = (unsigned char *)greenbuffer;
myImagePlanes[2] = (unsigned char *)bluebuffer;
myImage = [[NXBitmapImageRep alloc]
initDataPlanes:myImagePlanes
pixelsWide:width
pixelsHigh:height
bitsPerSample:8
samplesPerPixel:3
hasAlpha:NO
isPlanar:YES
colorSpace:NX_RGBColorSpace
bytesPerRow:width
bitsPerPixel:8];
if (myImage) {
NXStream *s = NXOpenMemory (NULL, 0, NX_READWRITE);
if(currentframe == startframe) {
id mySavePanel = [SavePanel new];
[mySavePanel runModal];
if([mySavePanel filename]) strcpy(filename,[mySavePanel filename]);
}
strcpy(tempfilename, filename);
postfixframe(tempfilename, currentframe);
strcat(tempfilename,".tiff");
if (s) {
[myImage writeTIFF:s usingCompression:compression];
NXFlush (s);
if (NXSaveToFile (s, tempfilename))
NXRunAlertPanel("Error Saving File",
"Filename: %s","OK",NULL,NULL,filename);
NXCloseMemory (s, NX_FREEBUFFER);
}
}
[myImage free];
} else {
NXRunAlertPanel("Incorrect byte count !",
"%d in red, %d in blue, %d in green.\nAll should = width*height = %d",
"OK",NULL,NULL,redbytes, greenbytes, bluebytes, bytecount);
}
currentframe++;
}
return self;
}
@end